package com.itheima.Service.imple;

import com.github.pagehelper.Page;
import com.github.pagehelper.PageHelper;
import com.itheima.Service.EmpLogService;
import com.itheima.Service.EmpService;
import com.itheima.entity.*;
import com.itheima.mapper.EmpExpMapper;
import com.itheima.mapper.EmpMapper;
import com.itheima.utils.JwtUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;

import java.time.LocalDateTime;
import java.util.Collection;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

@Service
@Slf4j
public class EmpServiceImpl implements EmpService {
    @Autowired
    private EmpMapper empMapper;
    @Autowired
    private EmpExpMapper empExpMapper;
    @Autowired
    private EmpLogService empLogService;
  /*  @Override
    //page页码，pageSize每页记录数
    public PageBean page(Integer page, Integer pageSize) {
        //1.调用mapper获取总记录数
        long total= empMapper.count();
        //2.调用mapper获取分页列表数据
        List<Emp> rows =empMapper.page((page-1)*pageSize,pageSize);
        //3.用pageBean对象将总记录数和分页列表数据进行封装

        return new PageBean(total,rows);
    }*/
  @Override
  //page页码，pageSize每页记录数
  public PageBean page(EmpParam empParam) {
        //1.设置分页参数
      PageHelper.startPage(empParam.getPage(), empParam.getPageSize());
        //2.调用mapper的列表查询方法
      List<Emp> empList = empMapper.listEmp(empParam);
      Page p= (Page) empList;//强转对象，Page底层继承了ArrayList
      //3.封装PageBean对象并放回

      return new PageBean(p.getTotal(),p.getResult());
  }
    @Transactional(rollbackFor = Exception.class)//开启事物管理---默认情况下只能处理运行时异常
    @Override
    public void addEmp(Emp emp) throws Exception{
        try {
            //1.补充数据完整性()
            emp.setCreateTime(LocalDateTime.now());
            emp.setUpdateTime(LocalDateTime.now());
            emp.setPassword("123456");
            //2.调用mapper层进行数据的处理操作(保存基本信息到员工表)
            empMapper.addEmp(emp);
            Integer id = emp.getId();
            log.info("id={}",id);
            /*//模拟非运行时异常
            if(true){
                throw new Exception("出错了");
            }*/

            List<EmpExpr> exprList = emp.getExprList();
            //关联员工id
            if(!CollectionUtils.isEmpty(exprList)){
                exprList.forEach((expr)->{
                    expr.setEmpId(id);
                });
            }
            //3.调用mapper层方法批量保存员工的工作经历到工作经历表
            empExpMapper.insertBatch(exprList);
        } finally {
            //无论新增员工与否都需要添加操作日志
            EmpLog empLog = new EmpLog();
            empLog.setOperateTime(LocalDateTime.now());
            empLog.setInfo("插入员工信息"+emp.getUsername());
            empLogService.insertLog(empLog);
        }
    }


    @Transactional
    public void delete(List<Integer> ids) {
        //1.调用mapper层删除emp
        empMapper.deleteBatch(ids);
        //2.调用mapper层删除emp对应的expr表中的内容
        empMapper.deleteExprBatch(ids);
    }
    //员工回显功能
    @Override
    public Emp getByid(Integer id) {
      /*  //方式一
        //1.调用mapper层查询方法，获取员工基本信息和员工经历信息
        return empMapper.getById(id);*/

        //方式二
        //1.查询员工基本信息，封装到Emp对象中
        Emp emp= empMapper.getById2(id);
        //2.查询员工经历信息，封装到Emp对象中
        List <EmpExpr>  empExprList=empExpMapper.getByEmpId(id);
        emp.setExprList(empExprList);
        //3.返回员工Emp对象
        return emp;
    }

    @Override
    @Transactional
    public void update(Emp emp) {
        //修改员工基本信息
        //补充基本属性
        emp.setUpdateTime(LocalDateTime.now());
        empMapper.update(emp);
        //修改员工经历信息(先删后增）
        empExpMapper.deleteByEmpId(emp.getId());
        List<EmpExpr> exprList = emp.getExprList();
        if(!CollectionUtils.isEmpty(exprList)){
            //关联员工id
            exprList.forEach((expr)->{
                expr.setEmpId(emp.getId());
            });
            empExpMapper.insertBatch(exprList);
        }

    }
    //查询所有员工
    @Override
    public List <Emp> getlist() {
      // 调用mapper层
        return empMapper.getList();
    }
    //员工登录
    @Override
    public Login login(Emp emp) {
        //调用mapper层
        Emp empDB= empMapper.login(emp);
        if(empDB!=null){
            //完善登录逻辑
            //自定义有效载荷
            Map<String, Object> clamis=new HashMap<>();
            clamis.put("id",empDB.getId());
            clamis.put("username",empDB.getUsername());
            //登陆成功需要生成JWT令牌（调用jwt工具类生成令牌）
            String jwt = JwtUtils.generateJwt(clamis);
            return new Login(empDB.getId(),empDB.getUsername(),empDB.getName(),jwt);
        }
        return null ;
    }
}
